home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 46 / Amiga Format CD46 (1999-10-20)(Future Publishing)(GB)[!][issue 1999-12].iso / -in_the_mag- / synth_studies / resgrep03b / source / exportedit.cc < prev    next >
C/C++ Source or Header  |  1999-09-15  |  19KB  |  758 lines

  1. //
  2. // Editieren der Conversions-Liste
  3. //
  4. extern "C" {
  5. #include <exec/types.h>
  6. #include <intuition/intuition.h>
  7. #include <intuition/classes.h>
  8. #include <intuition/classusr.h>
  9. #include <intuition/imageclass.h>
  10. #include <intuition/gadgetclass.h>
  11. #include <libraries/gadtools.h>
  12. #include <graphics/displayinfo.h>
  13. #include <graphics/gfxbase.h>
  14.  
  15. #include <dos/dos.h>
  16.  
  17. #include <stdlib.h>
  18. };
  19. #include "id.h"
  20. #include "export.h"
  21. #include "resgrep.h"
  22. #include "utils.h"
  23.  
  24. extern "C" {
  25. char *strdup(char *);
  26. #include <clib/exec_protos.h>
  27. #include <clib/gadtools_protos.h>
  28. #include <clib/intuition_protos.h>
  29. };
  30.  
  31. #define GD_convert                   0
  32. #define GD_to                       1
  33. #define GD_command                   2
  34. #define GD_cfind                   3
  35. #define GD_arexx                   4
  36. #define GD_writeto                   5
  37. #define GD_file                    6
  38. #define GD_ffind                   7
  39. #define GD_ok                       8
  40. #define GD_cancel                   9
  41. #define GD_add                       10
  42. #define GD_remove                   11
  43.  
  44. struct Window         *Wnd     = 0l;
  45. struct Gadget         *GList     = 0l;
  46. struct Gadget         *Gadgets[12];
  47.  
  48. extern list    *conversions;
  49. UBYTE          **convertLabels;
  50. UBYTE          **toLabels;
  51.  
  52.  
  53. char **makeConvertLabels(void)
  54. {
  55.    int          index=0;
  56.    char     **b;
  57.    node      *n;
  58.    unsigned long  last=0;
  59.  
  60.    // Voraussetzung: mindestens ZWEI Elemente in der Liste
  61.    last = conversions->getfirst()->getpack();
  62.    index++;
  63.  
  64.    for(n=conversions->getfirst(); n->getsucc(); n=n->getsucc() )
  65.       if( last!=n->getpack() )
  66.       {
  67.      index++;
  68.      last=n->getpack();
  69.       }
  70.    if( (b=(char **)malloc(sizeof(*b)*(index+1)))==NULL )
  71.       return NULL;
  72.  
  73.    index=0;
  74.    last = conversions->getfirst()->getpack();
  75.    b[index++]=strdup(pack2cstr(conversions->getfirst()->getpack()));
  76.    for(n=conversions->getfirst(); n->getsucc(); n=n->getsucc())
  77.       if( last!=n->getpack() )
  78.       {
  79.      b[index++]=strdup(pack2cstr(n->getpack()));
  80.      last=n->getpack();
  81.       }
  82.    b[index]=NULL;
  83.    return b;
  84. }
  85.  
  86. char **makeToLabels(unsigned long p)
  87. {
  88.    int index=0;
  89.    char  **b;
  90.  
  91.    for(node *n=conversions->findpack(p);
  92.        n!=NULL && n->getsucc() && n->getpack()==p;
  93.        n=n->getsucc(), index++)
  94.       ;
  95.    if( (b=(char **)malloc(sizeof(*b)*(index+1)))==NULL )
  96.       return NULL;
  97.    for(index=0,n=conversions->findpack(p);
  98.        n!=NULL && n->getsucc() && n->getpack()==p;
  99.        n=n->getsucc(),index++)
  100.       b[index]=n->getname();
  101.    b[index]=NULL;
  102.    return b;
  103. }
  104.  
  105. // Sucht aus dem 'ConvNum'ten Übertragungsart die 'ToNum'te aus.
  106. node *getselnode(int ConvNum, int ToNum)
  107. {
  108.    node *n;
  109.    unsigned long  last;
  110.  
  111.    if( ConvNum==0 )
  112.       n=conversions->getfirst();
  113.    else
  114.    {
  115.       last = conversions->getfirst()->getpack();
  116.  
  117.       for(n=conversions->getfirst(); n->getsucc(); n=n->getsucc() )
  118.      if( last!=n->getpack() )
  119.      {
  120.         ConvNum--;
  121.         last=n->getpack();
  122.         if( ConvNum==0 )
  123.            break;
  124.      }
  125.       if( ConvNum!=0 )
  126.      return NULL;    // Nicht gefunden
  127.    }
  128.  
  129.    for(;n->getsucc() && ToNum>0; n=n->getsucc(), ToNum--)
  130.       ;
  131.  
  132.    return n;
  133. }
  134.  
  135. void ActiveNode(node *n)
  136. {
  137.    node *vor;
  138.  
  139.    conversions->remove(n);
  140.  
  141.    if( (vor=conversions->findpack(n->getpack()))==NULL )
  142.       conversions->enqueuepack(n);
  143.    else
  144.       conversions->insert(vor->getpred(),n);
  145. }
  146.  
  147. // Liesst den Text aus dem File- und dem Command-Gadget
  148. void convert::ReadText(void)
  149. {
  150.    struct StringInfo    *si;
  151.    struct Gadget    *g;
  152.  
  153.    if( command != NULL )
  154.       free(command);
  155.    command=NULL;
  156.    if( filename != NULL )
  157.       free(filename);
  158.    filename=NULL;
  159.  
  160. //   g = Gadgets[GD_command];
  161. //   si = (struct StringInfo *)(g->SpecialInfo);
  162. //   command = strdup( (char *) si->Buffer );
  163.  
  164.    command = strdup( (char *)
  165.       ((struct StringInfo *)(Gadgets[GD_command]->SpecialInfo))->Buffer);
  166.    filename = strdup( (char *)
  167.       ((struct StringInfo *)(Gadgets[GD_file]->SpecialInfo))->Buffer );
  168. }
  169.  
  170.  
  171. // Stellt den Inhalt des Knotens in dem Fenster dar.
  172. void UpdateWindow(node *SelNode, int ConvNum)
  173. {
  174.    convert *c=(convert *)SelNode;
  175.  
  176.    GT_SetGadgetAttrs(Gadgets[GD_convert],Wnd,NULL,GTCY_Labels,convertLabels,
  177.              GTCY_Active,ConvNum, TAG_DONE );
  178.  
  179.    if( toLabels!=NULL )
  180.       free(toLabels);
  181.    toLabels=(UBYTE **)makeToLabels(SelNode->getpack());
  182.    GT_SetGadgetAttrs(Gadgets[GD_to],Wnd,NULL,GTCY_Labels,toLabels,
  183.              TAG_DONE );
  184.  
  185.    GT_SetGadgetAttrs(Gadgets[GD_command],Wnd,NULL,GTST_String,c->command,TAG_DONE);
  186.  
  187.    GT_SetGadgetAttrs(Gadgets[GD_arexx],Wnd,NULL,GTCB_Checked,c->isARexx,TAG_DONE);
  188.  
  189.    GT_SetGadgetAttrs(Gadgets[GD_file],Wnd,NULL,GTST_String,c->filename,TAG_DONE);
  190.  
  191.    if( c->sendto==Clipboard )
  192.    {
  193.       GT_SetGadgetAttrs(Gadgets[GD_writeto],Wnd,NULL,GTCY_Active,0,TAG_DONE);
  194.       GT_SetGadgetAttrs(Gadgets[GD_file],Wnd,NULL,GA_Disabled,TRUE,TAG_DONE);
  195.    }
  196.    else
  197.    {
  198.       GT_SetGadgetAttrs(Gadgets[GD_writeto],Wnd,NULL,GTCY_Active,1,TAG_DONE);
  199.       GT_SetGadgetAttrs(Gadgets[GD_file],Wnd,NULL,GA_Disabled,FALSE,TAG_DONE);
  200.    }
  201. }
  202.  
  203.  
  204. // ------------------------------------------------------------------------
  205. // Das Add Fenster
  206. // Rückgabewerte:
  207. // 0: Keinen Fehler
  208. // 1: Konnte Kontext nicht anlegen
  209. // 2: Konnte Gadget nicht anlegen
  210. // 3: Fehler beim kreiren der Menus
  211. // 4: Fehler beim öffnen des Fensters
  212. // 11: Fehlerhafter Typ.
  213.  
  214. int addconv(unsigned long *newtype)
  215. {
  216. #define GDA_resourcetype            0
  217. #define GDA_ok                    1
  218. #define GDA_cancel                2
  219.  
  220.    struct Window    *AWnd = NULL;
  221.    struct Gadget    *AGList = NULL;
  222.    struct Menu        *AMenus = NULL;
  223.    struct Gadget    *AGadgets[3];
  224.    UWORD         ALeft = 169;
  225.    UWORD         ATop = 89;
  226.    UWORD         AWidth = 261;
  227.    UWORD         AHeight = 54;
  228.    UBYTE        *AWdt = (UBYTE *)" Add Resource Type";
  229.  
  230.    struct TextAttr topaz8 =
  231.    {
  232.       ( STRPTR )"topaz.font", 8, 0x00, 0x41
  233.    };
  234.  
  235.    struct NewMenu ANewMenu[] =
  236.    {
  237.       NM_TITLE, (UBYTE *)"Control", NULL, 0, 0, NULL,
  238.       NM_ITEM, (UBYTE *)"Ok", (UBYTE *)"O", 0, 0, NULL,
  239.       NM_ITEM, (UBYTE *)"Cancel", (UBYTE *)"C", 0, 0, NULL,
  240.       NM_ITEM, (UBYTE *)NM_BARLABEL, NULL, 0, NULL, NULL,
  241.       NM_ITEM, (UBYTE *)"Close Window", (UBYTE *)"K", 0, 0, NULL,
  242.       NM_END, NULL, NULL, 0, NULL, NULL
  243.    };
  244.  
  245.    struct NewGadget    ng;
  246.    struct Gadget       *g;
  247.    UWORD           offx, offy;
  248.  
  249.    struct IntuiMessage     theIMsg, *imsg;
  250.    char          *newtypestring;
  251.  
  252.    offx = theScreen->WBorLeft;
  253.    offy = theScreen->WBorTop + theScreen->RastPort.TxHeight + 1;
  254.  
  255.    if ( NOT( g = CreateContext( &AGList )))
  256.       return( 1L );
  257.  
  258.    ng.ng_LeftEdge     =    offx + 158;
  259.    ng.ng_TopEdge     =    offy + 6;
  260.    ng.ng_Width         =    56;
  261.    ng.ng_Height      =    13;
  262.    ng.ng_GadgetText     =    (UBYTE *)"Recource Type";
  263.    ng.ng_TextAttr     =    &topaz8;
  264.    ng.ng_GadgetID     =    GDA_resourcetype;
  265.    ng.ng_Flags         =    PLACETEXT_LEFT;
  266.    ng.ng_VisualInfo     =    VisualInfo;
  267.  
  268.    g = CreateGadget( STRING_KIND, g, &ng, GTST_MaxChars, 4, TAG_DONE );
  269.  
  270.    AGadgets[ 0 ] = g;
  271.  
  272.    ng.ng_LeftEdge     =    offx + 26;
  273.    ng.ng_TopEdge     =    offy + 27;
  274.    ng.ng_Width         =    77;
  275.    ng.ng_Height      =    18;
  276.    ng.ng_GadgetText     =    (UBYTE *)"Ok";
  277.    ng.ng_GadgetID     =    GDA_ok;
  278.    ng.ng_Flags         =    PLACETEXT_IN;
  279.  
  280.    g = CreateGadget( BUTTON_KIND, g, &ng, TAG_DONE );
  281.  
  282.    AGadgets[ 1 ] = g;
  283.  
  284.    ng.ng_LeftEdge     =    offx + 154;
  285.    ng.ng_TopEdge     =    offy + 26;
  286.    ng.ng_Width         =    76;
  287.    ng.ng_GadgetText     =    (UBYTE *)"Cancel";
  288.    ng.ng_GadgetID     =    GDA_cancel;
  289.  
  290.    g = CreateGadget( BUTTON_KIND, g, &ng, TAG_DONE );
  291.  
  292.    AGadgets[ 2 ] = g;
  293.  
  294.    if ( NOT g )
  295.       return( 2L );
  296.  
  297.    if ( NOT( AMenus = CreateMenus( ANewMenu, GTMN_FrontPen, NULL, TAG_DONE )))
  298.       return( 3L );
  299.  
  300.    LayoutMenus( AMenus, VisualInfo, GTMN_TextAttr, &topaz8, TAG_DONE );
  301.  
  302.    if ( NOT( AWnd = OpenWindowTags( NULL,
  303.             WA_Left,          ALeft,
  304.             WA_Top,          ATop,
  305.             WA_Width,          AWidth,
  306.             WA_Height,          AHeight + offy,
  307.             WA_IDCMP,          STRINGIDCMP | BUTTONIDCMP |
  308.                       IDCMP_MENUPICK | IDCMP_REFRESHWINDOW,
  309.             WA_Flags,          WFLG_DRAGBAR | WFLG_DEPTHGADGET |
  310.                       WFLG_SMART_REFRESH | WFLG_ACTIVATE,
  311.             WA_Gadgets,       AGList,
  312.             WA_Title,          AWdt,
  313.             WA_ScreenTitle,   "ResGrep - Add Resource Type",
  314.                    TAG_DONE )))
  315.       return( 4L );
  316.  
  317.    SetMenuStrip( AWnd, AMenus );
  318.    GT_RefreshWindow( AWnd, NULL );
  319.  
  320.    for(;;)     // Main Event Loop
  321.    {
  322.  
  323.    Wait( 1UL<<(unsigned long)(AWnd->UserPort->mp_SigBit) );
  324.    while( (imsg=GT_GetIMsg(AWnd->UserPort)) != NULL )
  325.    {
  326.       // Message kopieren und orginale sofort zurückschicken.
  327.       theIMsg=*imsg;
  328.       GT_ReplyIMsg(imsg);
  329.       switch( theIMsg.Class )
  330.       {
  331.        case IDCMP_INTUITICKS:
  332.      break;
  333.        case IDCMP_MENUPICK:
  334.      {
  335.         int MenuNumber=theIMsg.Code;
  336.         struct MenuItem *Item;
  337.  
  338.         while( MenuNumber!=MENUNULL )
  339.         {
  340.            Item=ItemAddress(Menus,MenuNumber);
  341.            switch( MENUNUM(MenuNumber) )
  342.            {
  343.         case 0:
  344.           switch( ITEMNUM(MenuNumber) )
  345.           {
  346.            case 0:        // Ok
  347.            case 3:        // Close Window
  348.              newtypestring = (char *)
  349.             ((struct StringInfo *)(AGadgets[GDA_resourcetype]
  350.                            ->SpecialInfo))
  351.                ->Buffer;
  352.              if ( AMenus      )
  353.              {
  354.             ClearMenuStrip( AWnd );
  355.             FreeMenus( AMenus );
  356.              }
  357.              if ( AWnd        )
  358.             CloseWindow( AWnd );
  359.              if ( AGList      )
  360.             FreeGadgets( AGList );
  361.              if( strlen(newtypestring)!=4 )
  362.             return 11;
  363.              *newtype=cstr2pack(newtypestring);
  364.              return 0;
  365.              break;
  366.            case 1:
  367.              return 12;
  368.              if ( AMenus      )
  369.              {
  370.             ClearMenuStrip( AWnd );
  371.             FreeMenus( AMenus );
  372.              }
  373.              if ( AWnd        )
  374.             CloseWindow( AWnd );
  375.              if ( AGList      )
  376.             FreeGadgets( AGList );
  377.              break;
  378.            default:
  379.              ResError("Fatal:\nUnknown Menuitem.");
  380.              break;
  381.           }
  382.         default:
  383.           ResError("Fatal:\nUnknown Menu.");
  384.           break;
  385.            }
  386.            MenuNumber=Item->NextSelect;
  387.         }
  388.      }
  389.      break;
  390.        case IDCMP_GADGETUP:
  391.      switch( ((struct Gadget *)theIMsg.IAddress)->GadgetID )
  392.      {
  393.       case GDA_ok:
  394.         newtypestring = (char *)
  395.            ((struct StringInfo *)(AGadgets[GDA_resourcetype]
  396.                       ->SpecialInfo))
  397.           ->Buffer;
  398.         if ( AMenus      )
  399.         {
  400.            ClearMenuStrip( AWnd );
  401.            FreeMenus( AMenus );
  402.         }
  403.         if ( AWnd        )
  404.            CloseWindow( AWnd );
  405.         if ( AGList      )
  406.            FreeGadgets( AGList );
  407.         if( strlen(newtypestring)!=4 )
  408.            return 11;
  409.         *newtype=cstr2pack(newtypestring);
  410.         return 0;
  411.       case GDA_cancel:
  412.         if ( AMenus      )
  413.         {
  414.            ClearMenuStrip( AWnd );
  415.            FreeMenus( AMenus );
  416.         }
  417.         if ( AWnd        )
  418.            CloseWindow( AWnd );
  419.         if ( AGList      )
  420.            FreeGadgets( AGList );
  421.         return 12;
  422.         break;
  423.       case GDA_resourcetype:
  424.         break;
  425.       default:
  426.         ResError("Fatal:\nUnknown Gadget");
  427.         break;
  428.      }
  429.      break;
  430.        default:
  431.      ResError("Fatal:\nUnknown Message.");
  432.      break;
  433.       }
  434.    }
  435.    } // Forever
  436.    return 13;
  437. }
  438.  
  439.  
  440. // ------------------------------------------------------------------------
  441. // Das Editfenster.
  442.  
  443.  
  444. void editconv(void)
  445. {
  446.    int            ConvNum=0, ToNum=0, WriteDataNum=0;
  447.    node         *SelectedNode;
  448.  
  449.  
  450.    UBYTE     *writetoLabels[] =
  451.    {
  452.        (UBYTE *)"Clipboard", (UBYTE *)"File", 0l
  453.    };
  454.  
  455.    struct TextAttr topaz8 = {
  456.        ( STRPTR )"topaz.font", 8, 0x00, 0x01 };
  457.  
  458.    struct TagItem    WindowTags[] =
  459.    {
  460.       WA_Left,        112,
  461.       WA_Top,        56,
  462.       WA_Width,     388,
  463.       WA_Height,    144,
  464.       WA_IDCMP,     IDCMP_GADGETUP | IDCMP_CLOSEWINDOW |
  465.             IDCMP_REFRESHWINDOW,
  466.       WA_Flags,     WFLG_DRAGBAR | WFLG_DEPTHGADGET |
  467.             WFLG_CLOSEGADGET | WFLG_SMART_REFRESH |
  468.             WFLG_ACTIVATE,
  469.       WA_Gadgets,    0l,
  470.       WA_Title,     (ULONG)"Edit Conversions",
  471.       WA_ScreenTitle,    (ULONG)"ResGrep - Edit Conversions",
  472.       WA_MinWidth,    67,
  473.       WA_MinHeight,    21,
  474.       WA_MaxWidth,    640,
  475.       WA_MaxHeight,    256,
  476.       TAG_DONE
  477.    };
  478.  
  479.    struct NewGadget    ng;
  480.    struct Gadget       *g;
  481.    struct IntuiMessage     theIMsg, *imsg;
  482.  
  483.    convertLabels=(UBYTE **)makeConvertLabels();
  484.    toLabels=(UBYTE **)makeToLabels( cstr2pack((char *)*convertLabels) );
  485.  
  486.    if ( NOT( g = CreateContext( &GList )))
  487.       return;
  488.  
  489.    ng.ng_LeftEdge     =    80;
  490.    ng.ng_TopEdge     =    19;
  491.    ng.ng_Width         =    81;
  492.    ng.ng_Height      =    13;
  493.    ng.ng_GadgetText     =    (UBYTE *)"Convert";
  494.    ng.ng_TextAttr     =    &topaz8;
  495.    ng.ng_GadgetID     =    GD_convert;
  496.    ng.ng_Flags         =    PLACETEXT_LEFT;
  497.    ng.ng_VisualInfo     =    VisualInfo;
  498.  
  499.    g = CreateGadget(CYCLE_KIND,g, &ng, GTCY_Labels, convertLabels, TAG_DONE );
  500.  
  501.    Gadgets[ 0 ] = g;
  502.  
  503.    ng.ng_LeftEdge     =    207;
  504.    ng.ng_Width         =    155;
  505.    ng.ng_GadgetText     =    (UBYTE *)"to";
  506.    ng.ng_GadgetID     =    GD_to;
  507.  
  508.    g = CreateGadget( CYCLE_KIND, g, &ng, GTCY_Labels, toLabels, TAG_DONE );
  509.  
  510.    Gadgets[ 1 ] = g;
  511.  
  512.    ng.ng_LeftEdge     =    80;
  513.    ng.ng_TopEdge     =    39;
  514.    ng.ng_Width         =    201;
  515.    ng.ng_GadgetText     =    (UBYTE *)"Command";
  516.    ng.ng_GadgetID     =    GD_command;
  517.  
  518.    g = CreateGadget( STRING_KIND, g, &ng, GTST_MaxChars, 256, TAG_DONE );
  519.  
  520.    Gadgets[ 2 ] = g;
  521.  
  522.    ng.ng_LeftEdge     =    292;
  523.    ng.ng_Width         =    70;
  524.    ng.ng_GadgetText     =    (UBYTE *)"Find...";
  525.    ng.ng_GadgetID     =    GD_cfind;
  526.    ng.ng_Flags         =    PLACETEXT_IN;
  527.  
  528.    g = CreateGadget( BUTTON_KIND, g, &ng, GA_Disabled, TRUE, TAG_DONE );
  529.  
  530.    Gadgets[ 3 ] = g;
  531.  
  532.    ng.ng_LeftEdge     =    81;
  533.    ng.ng_TopEdge     =    61;
  534.    ng.ng_GadgetText     =    (UBYTE *)"ARexx";
  535.    ng.ng_GadgetID     =    GD_arexx;
  536.    ng.ng_Flags         =    PLACETEXT_LEFT;
  537.  
  538.    g = CreateGadget( CHECKBOX_KIND, g, &ng, GTCB_Checked, TRUE, TAG_DONE );
  539.  
  540.    Gadgets[ 4 ] = g;
  541.  
  542.    ng.ng_LeftEdge     =    233;
  543.    ng.ng_TopEdge     =    60;
  544.    ng.ng_Width         =    128;
  545.    ng.ng_Height      =    13;
  546.    ng.ng_GadgetText     =    (UBYTE *)"Write Data to";
  547.    ng.ng_GadgetID     =    GD_writeto;
  548.  
  549.    g = CreateGadget(CYCLE_KIND,g, &ng, GTCY_Labels, writetoLabels, TAG_DONE );
  550.  
  551.    Gadgets[ 5 ] = g;
  552.  
  553.    ng.ng_LeftEdge     =    80;
  554.    ng.ng_TopEdge     =    83;
  555.    ng.ng_Width         =    201;
  556.    ng.ng_GadgetText     =    (UBYTE *)"File";
  557.    ng.ng_GadgetID     =    GD_file;
  558.  
  559.    g = CreateGadget( STRING_KIND, g, &ng, GTST_MaxChars, 256, TAG_DONE );
  560.  
  561.    Gadgets[ 6 ] = g;
  562.  
  563.    ng.ng_LeftEdge     =    292;
  564.    ng.ng_Width         =    70;
  565.    ng.ng_GadgetText     =    (UBYTE *)"Find...";
  566.    ng.ng_GadgetID     =    GD_ffind;
  567.    ng.ng_Flags         =    PLACETEXT_IN;
  568.  
  569.    g = CreateGadget( BUTTON_KIND, g, &ng, GA_Disabled, TRUE, TAG_DONE );
  570.  
  571.    Gadgets[ 7 ] = g;
  572.  
  573.    ng.ng_LeftEdge     =    13;
  574.    ng.ng_TopEdge     =    110;
  575.    ng.ng_Width         =    86;
  576.    ng.ng_Height      =    19;
  577.    ng.ng_GadgetText     =    (UBYTE *)"OK";
  578.    ng.ng_GadgetID     =    GD_ok;
  579.  
  580.    g = CreateGadget( BUTTON_KIND, g, &ng, TAG_DONE );
  581.  
  582.    Gadgets[ 8 ] = g;
  583.  
  584.    ng.ng_LeftEdge     =    291;
  585.    ng.ng_GadgetText     =    (UBYTE *)"Cancel";
  586.    ng.ng_GadgetID     =    GD_cancel;
  587.  
  588.    g = CreateGadget( BUTTON_KIND, g, &ng, GA_Disabled, TRUE, TAG_DONE );
  589.  
  590.    Gadgets[ 9 ] = g;
  591.  
  592.    ng.ng_LeftEdge     =    106;
  593.    ng.ng_GadgetText     =    (UBYTE *)"Add...";
  594.    ng.ng_GadgetID     =    GD_add;
  595.  
  596.    g = CreateGadget( BUTTON_KIND, g, &ng, TAG_DONE );
  597.  
  598.    Gadgets[ 10 ] = g;
  599.  
  600.    ng.ng_LeftEdge     =    198;
  601.    ng.ng_GadgetText     =    (UBYTE *)"Remove";
  602.    ng.ng_GadgetID     =    GD_remove;
  603.  
  604.    g = CreateGadget( BUTTON_KIND, g, &ng, TAG_DONE );
  605.  
  606.    Gadgets[ 11 ] = g;
  607.  
  608.    if ( NOT g )
  609.       return;
  610.  
  611.    WindowTags[ 6 ].ti_Data = (ULONG)GList;
  612.  
  613.    if ( NOT( Wnd = OpenWindowTagList( 0l, WindowTags )))
  614.       return;
  615.  
  616.    GT_RefreshWindow( Wnd, 0l );
  617.  
  618.    SelectedNode = getselnode(ConvNum,ToNum); // Initialisieren
  619.    UpdateWindow(SelectedNode,ConvNum);
  620.    for(;;)     // Main Event Loop
  621.    {
  622.  
  623.    Wait( 1UL<<(unsigned long)(Wnd->UserPort->mp_SigBit) );
  624.    while( (imsg=GT_GetIMsg(Wnd->UserPort)) != NULL )
  625.    {
  626.       // Message kopieren und orginale sofort zurückschicken.
  627.       theIMsg=*imsg;
  628.       GT_ReplyIMsg(imsg);
  629.       switch( theIMsg.Class )
  630.       {
  631.        case IDCMP_INTUITICKS:
  632.      break;
  633.        case IDCMP_CLOSEWINDOW:
  634.      ((convert *)SelectedNode)->ReadText();
  635.      ActiveNode(SelectedNode);
  636.      if( Wnd )
  637.         CloseWindow( Wnd );
  638.      if ( GList )
  639.         FreeGadgets( GList );
  640.      return;
  641.      break;
  642.        case IDCMP_GADGETUP:
  643.      switch( ((struct Gadget *)theIMsg.IAddress)->GadgetID )
  644.      {
  645.       case GD_convert:
  646.         ((convert *)SelectedNode)->ReadText();
  647.         ActiveNode(SelectedNode);
  648.         ConvNum = theIMsg.Code;
  649.         ToNum = 0;
  650.         SelectedNode = getselnode(ConvNum,ToNum);
  651.         if( SelectedNode!=NULL )
  652.            UpdateWindow(SelectedNode,ConvNum);
  653.         break;
  654.       case GD_to:
  655.         ((convert *)SelectedNode)->ReadText();
  656.         ToNum = theIMsg.Code;
  657.         SelectedNode = getselnode(ConvNum,ToNum);
  658.         if( SelectedNode!=NULL )
  659.            UpdateWindow(SelectedNode,ConvNum);
  660.         break;
  661.       case GD_command: // Wird schon in 'convert' und 'to' erledigt.
  662.       case GD_file:
  663.         break;
  664.       case GD_arexx:
  665.         ((convert *)SelectedNode)->isARexx =
  666.            ((convert *)SelectedNode)->isARexx ? false : true ;
  667.         break;
  668.       case GD_writeto:
  669.         switch( theIMsg.Code )
  670.         {
  671.          case 0:
  672.            ((convert *)SelectedNode)->sendto = Clipboard;
  673.            break;
  674.          case 1:
  675.            ((convert *)SelectedNode)->sendto = File;
  676.            break;
  677.          default:
  678.            ResError("Fatal:\nUnknown WriteTo method.");
  679.            break;
  680.         }
  681.         if( SelectedNode!=NULL )
  682.            UpdateWindow(SelectedNode,ConvNum);
  683.         break;
  684.       case GD_ok:
  685.         ((convert *)SelectedNode)->ReadText();
  686.         ActiveNode(SelectedNode);
  687.         if( Wnd )
  688.            CloseWindow( Wnd );
  689.         if ( GList )
  690.            FreeGadgets( GList );
  691.         ActiveNode(SelectedNode);
  692.         return;
  693.         break;
  694.       case GD_add:
  695.         {
  696.            unsigned long newtype, ret;
  697.            if( (ret=addconv(&newtype))!=0 )
  698.            {
  699.           if( ret!= 12)
  700.              ResError("An Error occured while\n"
  701.                   "adding a new conversion.");
  702.           break;
  703.            }
  704.            conversions->enqueuepack( new
  705.           convert(newtype,0,"raw data",NULL,
  706.               false,File,"T:ResGrepRawData",false) );
  707.            if(convertLabels!=NULL)
  708.           free(convertLabels);
  709.            convertLabels=(UBYTE **)makeConvertLabels();
  710.            ConvNum=0;
  711.            ToNum=0;
  712.            SelectedNode = getselnode(ConvNum,ToNum); // Initialisieren
  713.            UpdateWindow(SelectedNode, ConvNum);
  714.         }
  715.         break;
  716.       case GD_remove:
  717.         if( ((convert *)SelectedNode)->builtin==true )
  718.         {
  719.            ResError("Can't remove builtin function.");
  720.            break;
  721.         }
  722.         conversions->remove(SelectedNode);
  723.         if(convertLabels!=NULL)
  724.            free(convertLabels);
  725.         convertLabels=(UBYTE **)makeConvertLabels();
  726.         ConvNum = 0;
  727.         ToNum = 0;
  728.         SelectedNode = getselnode(ConvNum,ToNum);
  729.         if( SelectedNode!=NULL )
  730.            UpdateWindow(SelectedNode,ConvNum);
  731.         break;
  732.       default:
  733.         ResError("Fatal:\nUnknown Gadget.\n");
  734.         break;
  735.      }
  736.      if( SelectedNode==NULL )
  737.      {
  738.         ResError("Fatal:\nSelected Node == NULL.\nBetter I quit.");
  739.         if( Wnd )
  740.            CloseWindow( Wnd );
  741.         if ( GList )
  742.            FreeGadgets( GList );
  743.         return;
  744.      }
  745.      break;
  746.        default:
  747.      printf("Unbekannte Meldg: %08lx %04x\n",theIMsg.Class, theIMsg.Code);
  748.      ResWarning("Unknown Message.\n");
  749.       }
  750.    }
  751.  
  752.    } // End forever
  753. }
  754.  
  755.  
  756.  
  757.  
  758.